package com.example.stella.models;

/**
 * =================== 数据模型 - 交易记录 ===================
 * 交易记录模型类 - 表示一条收入或支出记录
 * 用途：封装交易数据，提供数据结构定义和访问接口
 * 设计模式：JavaBean模式（私有字段 + 公有访问器）
 */
public class Transaction {
    
    // =================== 数据声明部分 ===================
    // 主键标识
    private int id;             // 交易记录唯一标识符（数据库自增主键）
    
    // 关联关系数据
    private int userId;         // 所属用户ID（外键，关联用户表）
    
    // 交易核心数据
    private String type;        // 交易类型：收入/支出（业务分类字段）
    private double amount;      // 金额（核心数值数据，支持小数）
    private String category;    // 分类（如：餐饮、交通、工资等，便于统计分析）
    private String description; // 描述备注（用户自定义说明，可选字段）
    
    // 时间数据
    private long date;          // 交易发生日期（时间戳，用户可选择）
    private long createdAt;     // 记录创建时间（时间戳，系统自动生成）

    // =================== 构造器部分 ===================
    /**
     * 默认构造函数 - 用于框架反射和数据库映射
     */
    public Transaction() {}

    /**
     * 业务构造函数 - 创建新交易记录时使用
     * 用途：用户添加新交易时，系统自动设置创建时间
     * @param userId 所属用户ID
     * @param type 交易类型（收入/支出）
     * @param amount 交易金额
     * @param category 交易分类
     * @param description 描述备注
     * @param date 交易日期
     */
    public Transaction(int userId, String type, double amount, String category, String description, long date) {
        this.userId = userId;
        this.type = type;
        this.amount = amount;
        this.category = category;
        this.description = description;
        this.date = date;
        this.createdAt = System.currentTimeMillis(); // 系统自动设置创建时间
    }

    /**
     * 数据库构造函数 - 从数据库读取完整交易记录时使用
     * 用途：数据库查询结果映射为对象，包含所有字段信息
     * @param id 记录ID
     * @param userId 所属用户ID
     * @param type 交易类型
     * @param amount 交易金额
     * @param category 交易分类
     * @param description 描述备注
     * @param date 交易日期
     * @param createdAt 创建时间
     */
    public Transaction(int id, int userId, String type, double amount, String category, String description, long date, long createdAt) {
        this.id = id;
        this.userId = userId;
        this.type = type;
        this.amount = amount;
        this.category = category;
        this.description = description;
        this.date = date;
        this.createdAt = createdAt;
    }

    // =================== 数据访问器部分（Getter/Setter）===================
    // 以下方法提供对私有数据的安全访问接口
    
    // 主键访问器
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    // 用户关联访问器
    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    // 交易类型访问器
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    // 金额访问器
    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    // 分类访问器
    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    // 描述访问器
    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    // 交易日期访问器
    public long getDate() {
        return date;
    }

    public void setDate(long date) {
        this.date = date;
    }

    // 创建时间访问器
    public long getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(long createdAt) {
        this.createdAt = createdAt;
    }
} 